package br.com.velp.sudecap.datamodel;

import br.com.velp.sudecap.dto.ImovelParametrosConsultaDTO;
import br.com.velp.sudecap.entidade.Imovel;
import br.com.velp.sudecap.service.ImovelService;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.hibernate.criterion.Order;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SelectableDataModel;
import org.primefaces.model.SortOrder;

/**
 * <sumario>
 * <objetivo>"Rastreabilidade"</objetivo>
 * <autor>EDUARDO SANTOS DE OLIVEIRA</autor>
 * <versao>1.0.0.0</versao>
 * <data_criacao> 17.10.2012 </data_criacao>
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisito_afetado> RF008.01 - Listar Cartórios </requisito_afetado>
 * <descricao> Data Model Para Pesquisa de Imóveis Por Demanda </descricao>
 * </sumario>
 */
public class ImovelDataModel extends LazyDataModel<Imovel> implements Serializable, SelectableDataModel<Imovel> {

    private List<Imovel> imoveis;
    private ImovelService imovelService;
    private ImovelParametrosConsultaDTO parametros;

    public ImovelDataModel(ImovelService imovelService, ImovelParametrosConsultaDTO parametros) {
	this.imovelService = imovelService;
	this.imoveis = new ArrayList<Imovel>();
	this.parametros = parametros;
    }

    @Override
    public List<Imovel> load(int firstResult, int maxResults, String campoOrdenacao, SortOrder sortOrder, Map<String, String> filters) {

	Order order = null;

	if (sortOrder != null && campoOrdenacao != null) {
	    if (sortOrder.equals(SortOrder.ASCENDING)) {
		order = Order.asc(campoOrdenacao);
	    } else if (sortOrder.equals(SortOrder.DESCENDING)) {
		order = Order.desc(campoOrdenacao);
	    }
	}

	setRowCount(this.imovelService.contarImoveis(this.parametros));
	this.imoveis = this.imovelService.buscarImoveisPaginados(firstResult, maxResults, this.parametros, order);
	
	return this.imoveis;

    }

    @Override
    public Object getRowKey(Imovel imovel) {
	return imovel.getId();
    }

    @Override
    public Imovel getRowData(String idImovel) {
	Long id = Long.valueOf(idImovel);
	for (Imovel imovel : this.imoveis) {
	    if (id.equals(imovel.getId())) {
		return imovel;
	    }
	}
	return null;
    }

}
